#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
高斯数据库表字段添加脚本
功能：读取columns.txt文件，生成ALTER TABLE语句来添加字段到现有表中
作者：AI Assistant
"""

import os

def map_data_type(original_type):
    """
    将原始数据类型映射为高斯数据库支持的数据类型
    
    Args:
        original_type (str): 原始数据类型
        
    Returns:
        str: 映射后的数据类型
    """
    type_mapping = {
        'bigint': 'BIGINT',
        'string': 'VARCHAR(500)',  # 默认长度500，可根据需要调整
        'int4': 'INTEGER',
        'varchar': 'VARCHAR',
        'text': 'TEXT',
        'decimal': 'DECIMAL',
        'float': 'FLOAT',
        'double': 'DOUBLE PRECISION',
        'date': 'DATE',
        'timestamp': 'TIMESTAMP'
    }
    
    # 如果是varchar类型且包含长度，直接返回
    if original_type.lower().startswith('varchar('):
        return original_type.upper()
    
    return type_mapping.get(original_type.lower(), 'VARCHAR(500)')

def read_columns_file(file_path):
    """
    读取columns.txt文件并解析字段信息
    
    Args:
        file_path (str): columns.txt文件路径
        
    Returns:
        list: 包含字段信息的列表，每个元素为(表名, 字段名, 数据类型, 注释)
    """
    columns = []
    
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            for line_num, line in enumerate(f, 1):
                line = line.strip()
                if not line:  # 跳过空行
                    continue
                    
                parts = line.split('\t')
                if len(parts) >= 4:
                    table_name = parts[0].strip()
                    column_name = parts[1].strip()
                    data_type = parts[2].strip()
                    comment = parts[3].strip()
                    
                    columns.append((table_name, column_name, data_type, comment))
                else:
                    print(f"警告：第{line_num}行格式不正确，跳过: {line}")
                    
    except FileNotFoundError:
        print(f"错误：找不到文件 {file_path}")
        return []
    except Exception as e:
        print(f"错误：读取文件时发生异常 {e}")
        return []
        
    return columns

def generate_alter_table_statements(columns, target_table_name, full_table_name):
    """
    生成ALTER TABLE语句
    
    Args:
        columns (list): 字段信息列表
        target_table_name (str): 目标表名（用于匹配columns.txt中的表名）
        full_table_name (str): 完整表名（包含schema，用于生成SQL语句）
        
    Returns:
        list: ALTER TABLE语句列表
    """
    statements = []
    
    # 过滤出属于目标表的字段
    target_columns = [col for col in columns if col[0] == target_table_name]
    
    if not target_columns:
        print(f"警告：没有找到表 {target_table_name} 的字段定义")
        return statements
    
    print(f"找到 {len(target_columns)} 个字段需要添加到表 {target_table_name}")
    
    for table_name, column_name, data_type, comment in target_columns:
        # 映射数据类型
        mapped_type = map_data_type(data_type)
        
        # 生成ALTER TABLE语句（使用完整表名）
        alter_statement = f"ALTER TABLE {full_table_name} ADD COLUMN {column_name} {mapped_type};"
        statements.append(alter_statement)
        
        # 生成注释语句（使用完整表名）
        comment_statement = f"COMMENT ON COLUMN {full_table_name}.{column_name} IS '{comment}';"
        statements.append(comment_statement)
        
        # 添加空行分隔
        statements.append("")
    
    return statements

def save_statements_to_file(statements, output_file):
    """
    将生成的SQL语句保存到文件
    
    Args:
        statements (list): SQL语句列表
        output_file (str): 输出文件路径
    """
    try:
        with open(output_file, 'w', encoding='utf-8') as f:
            f.write("-- 高斯数据库表字段添加脚本\n")
            f.write("-- 自动生成的ALTER TABLE语句\n")
            f.write("-- 执行前请仔细检查\n\n")
            
            for statement in statements:
                f.write(statement + "\n")
                
        print(f"SQL语句已保存到文件: {output_file}")
        
    except Exception as e:
        print(f"错误：保存文件时发生异常 {e}")

def main():
    """
    主函数
    """
    # 文件路径配置
    current_dir = os.path.dirname(os.path.abspath(__file__))
    columns_file = os.path.join(current_dir, 'columns.txt')
    output_file = os.path.join(current_dir, 'alter_table_statements.sql')
    
    # 目标表名（从columns.txt文件中的格式）
    target_table_name = 'exec_imp_tag_bscom_bkupb_intg_upf_basic_info_np'
    # 完整的表名（包含schema）
    full_table_name = 'market.exec_imp_tag_bscom_bkupb_intg_upf_basic_info_np'
    
    print("开始处理字段定义文件...")
    print(f"输入文件: {columns_file}")
    print(f"输出文件: {output_file}")
    print(f"目标表名: {target_table_name}")
    print("-" * 50)
    
    # 读取字段定义
    columns = read_columns_file(columns_file)
    
    if not columns:
        print("没有读取到任何字段定义，程序退出")
        return
    
    print(f"总共读取到 {len(columns)} 个字段定义")
    
    # 生成ALTER TABLE语句
    statements = generate_alter_table_statements(columns, target_table_name, full_table_name)
    
    if not statements:
        print("没有生成任何SQL语句，程序退出")
        return
    
    print(f"生成了 {len([s for s in statements if s.strip()])} 条SQL语句")
    
    # 保存到文件
    save_statements_to_file(statements, output_file)
    
    print("-" * 50)
    print("处理完成！")
    print("\n前几条生成的语句示例:")
    for i, stmt in enumerate(statements[:6]):
        if stmt.strip():
            print(f"{i+1}. {stmt}")
    
    print("\n注意事项:")
    print("1. 执行SQL语句前请仔细检查表名和字段名")
    print("2. 根据实际需要调整VARCHAR字段的长度")
    print("3. 建议在测试环境先执行验证")
    print("4. 如果字段已存在，执行时会报错，请手动处理")

if __name__ == '__main__':
    main()